﻿using System;
using System.IO;
using System.Web;
using System.Net;
using System.Text;
using System.Linq;
using System.Drawing;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.Collections.Specialized;

namespace Imageshack
{
    public class ImageshackAPI
    {
        public string Upload(string fileName)
        {
            try
            {
                string contentType = "image/jpeg"; ;
                CookieContainer cookie = new CookieContainer();
                NameValueCollection par = new NameValueCollection();
                par["MAX_FILE_SIZE"] = "3145728";
                par["refer"] = "";
                par["brand"] = "";
                par["key"] = "YOUR API Key";
                par["optimage"] = "1";
                par["rembar"] = "1";
                par["submit"] = "host it!";
                List<string> l = new List<string>();
                string resp;
                par["optsize"] = "resample";
                resp = UploadFileEx(fileName, "http://www.imageshack.us/upload_api.php", "fileupload", contentType, par, cookie);
                return resp;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private string UploadFileEx(string uploadfile, string url, string fileFormName, string contenttype, NameValueCollection querystring, CookieContainer cookies)
        {
            if ((fileFormName == null) ||
              (fileFormName.Length == 0))
            {
                fileFormName = "fileupload";
            }

            if ((contenttype == null) ||
              (contenttype.Length == 0))
            {
                contenttype = "application/octet-stream";
            }


            string postdata;
            postdata = "?";
            if (querystring != null)
            {
                foreach (string key in querystring.Keys)
                {
                    postdata += key + "=" + querystring.Get(key) + "&";
                }
            }
            Uri uri = new Uri(url + postdata);


            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
            webrequest.CookieContainer = cookies;
            webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";


            // Build up the post message header
            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append(contenttype);
            sb.Append("\r\n");
            sb.Append("\r\n");

            string postHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

            // Build the trailing boundary string as a byte array
            // ensuring the boundary appears on a line by itself
            byte[] boundaryBytes =
                Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            FileStream fileStream = new FileStream(uploadfile,
                          FileMode.Open, FileAccess.Read);
            long length = postHeaderBytes.Length + fileStream.Length +
                                boundaryBytes.Length;
            webrequest.ContentLength = length;

            Stream requestStream = webrequest.GetRequestStream();

            // Write out our post header
            requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

            // Write out the file contents
            byte[] buffer = new Byte[checked((uint)Math.Min(4096,
                         (int)fileStream.Length))];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);

            // Write out the trailing boundary
            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
            WebResponse responce = webrequest.GetResponse();
            Stream s = responce.GetResponseStream();
            XmlSerializer xSerializer = new XmlSerializer(typeof(imginfo));
            imginfo ii = (imginfo)xSerializer.Deserialize(s);
            imginfoLinks ifl = ii.links;
            fileStream.Close();
            s.Close();
            return ifl.image_link;
        }
    }
}

//the following is the XML deserialization class used in the above class
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://ns.imageshack.us/imginfo/7/", IsNullable = false)]
public partial class imginfo
{

    private imginfoRating ratingField;

    private imginfoFiles filesField;

    private imginfoResolution resolutionField;

    private string classField;

    private string visibilityField;

    private imginfoUploader uploaderField;

    private imginfoLinks linksField;

    private byte versionField;

    private uint timestampField;

    /// <remarks/>
    public imginfoRating rating
    {
        get
        {
            return this.ratingField;
        }
        set
        {
            this.ratingField = value;
        }
    }

    /// <remarks/>
    public imginfoFiles files
    {
        get
        {
            return this.filesField;
        }
        set
        {
            this.filesField = value;
        }
    }

    /// <remarks/>
    public imginfoResolution resolution
    {
        get
        {
            return this.resolutionField;
        }
        set
        {
            this.resolutionField = value;
        }
    }

    /// <remarks/>
    public string @class
    {
        get
        {
            return this.classField;
        }
        set
        {
            this.classField = value;
        }
    }

    /// <remarks/>
    public string visibility
    {
        get
        {
            return this.visibilityField;
        }
        set
        {
            this.visibilityField = value;
        }
    }

    /// <remarks/>
    public imginfoUploader uploader
    {
        get
        {
            return this.uploaderField;
        }
        set
        {
            this.uploaderField = value;
        }
    }

    /// <remarks/>
    public imginfoLinks links
    {
        get
        {
            return this.linksField;
        }
        set
        {
            this.linksField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte version
    {
        get
        {
            return this.versionField;
        }
        set
        {
            this.versionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public uint timestamp
    {
        get
        {
            return this.timestampField;
        }
        set
        {
            this.timestampField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
public partial class imginfoRating
{

    private byte ratingsField;

    private decimal avgField;

    /// <remarks/>
    public byte ratings
    {
        get
        {
            return this.ratingsField;
        }
        set
        {
            this.ratingsField = value;
        }
    }

    /// <remarks/>
    public decimal avg
    {
        get
        {
            return this.avgField;
        }
        set
        {
            this.avgField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
public partial class imginfoFiles
{

    private imginfoFilesImage imageField;

    private imginfoFilesThumb thumbField;

    private ushort serverField;

    private ushort bucketField;

    /// <remarks/>
    public imginfoFilesImage image
    {
        get
        {
            return this.imageField;
        }
        set
        {
            this.imageField = value;
        }
    }

    /// <remarks/>
    public imginfoFilesThumb thumb
    {
        get
        {
            return this.thumbField;
        }
        set
        {
            this.thumbField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ushort server
    {
        get
        {
            return this.serverField;
        }
        set
        {
            this.serverField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ushort bucket
    {
        get
        {
            return this.bucketField;
        }
        set
        {
            this.bucketField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
public partial class imginfoFilesImage
{

    private ushort sizeField;

    private string contenttypeField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ushort size
    {
        get
        {
            return this.sizeField;
        }
        set
        {
            this.sizeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute("content-type")]
    public string contenttype
    {
        get
        {
            return this.contenttypeField;
        }
        set
        {
            this.contenttypeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
public partial class imginfoFilesThumb
{

    private ushort sizeField;

    private string contenttypeField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ushort size
    {
        get
        {
            return this.sizeField;
        }
        set
        {
            this.sizeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute("content-type")]
    public string contenttype
    {
        get
        {
            return this.contenttypeField;
        }
        set
        {
            this.contenttypeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
public partial class imginfoResolution
{

    private ushort widthField;

    private ushort heightField;

    /// <remarks/>
    public ushort width
    {
        get
        {
            return this.widthField;
        }
        set
        {
            this.widthField = value;
        }
    }

    /// <remarks/>
    public ushort height
    {
        get
        {
            return this.heightField;
        }
        set
        {
            this.heightField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
public partial class imginfoUploader
{

    private string ipField;

    /// <remarks/>
    public string ip
    {
        get
        {
            return this.ipField;
        }
        set
        {
            this.ipField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns.imageshack.us/imginfo/7/")]
public partial class imginfoLinks
{

    private string image_linkField;

    private string image_htmlField;

    private string image_bbField;

    private string image_bb2Field;

    private string thumb_linkField;

    private string thumb_htmlField;

    private string thumb_bbField;

    private string thumb_bb2Field;

    private string yfrog_linkField;

    private string yfrog_thumbField;

    private string ad_linkField;

    private string done_pageField;

    /// <remarks/>
    public string image_link
    {
        get
        {
            return this.image_linkField;
        }
        set
        {
            this.image_linkField = value;
        }
    }

    /// <remarks/>
    public string image_html
    {
        get
        {
            return this.image_htmlField;
        }
        set
        {
            this.image_htmlField = value;
        }
    }

    /// <remarks/>
    public string image_bb
    {
        get
        {
            return this.image_bbField;
        }
        set
        {
            this.image_bbField = value;
        }
    }

    /// <remarks/>
    public string image_bb2
    {
        get
        {
            return this.image_bb2Field;
        }
        set
        {
            this.image_bb2Field = value;
        }
    }

    /// <remarks/>
    public string thumb_link
    {
        get
        {
            return this.thumb_linkField;
        }
        set
        {
            this.thumb_linkField = value;
        }
    }

    /// <remarks/>
    public string thumb_html
    {
        get
        {
            return this.thumb_htmlField;
        }
        set
        {
            this.thumb_htmlField = value;
        }
    }

    /// <remarks/>
    public string thumb_bb
    {
        get
        {
            return this.thumb_bbField;
        }
        set
        {
            this.thumb_bbField = value;
        }
    }

    /// <remarks/>
    public string thumb_bb2
    {
        get
        {
            return this.thumb_bb2Field;
        }
        set
        {
            this.thumb_bb2Field = value;
        }
    }

    /// <remarks/>
    public string yfrog_link
    {
        get
        {
            return this.yfrog_linkField;
        }
        set
        {
            this.yfrog_linkField = value;
        }
    }

    /// <remarks/>
    public string yfrog_thumb
    {
        get
        {
            return this.yfrog_thumbField;
        }
        set
        {
            this.yfrog_thumbField = value;
        }
    }

    /// <remarks/>
    public string ad_link
    {
        get
        {
            return this.ad_linkField;
        }
        set
        {
            this.ad_linkField = value;
        }
    }

    /// <remarks/>
    public string done_page
    {
        get
        {
            return this.done_pageField;
        }
        set
        {
            this.done_pageField = value;
        }
    }
}
